#include "BlockQueue.hpp"

// 生产者线程：调用push接口，存入数据
void *Produce(void *args)
{
    BlockQueue<int> *bqueue = (BlockQueue<int> *)args;

    // 生产数据：
    while (true)
    {
        int data = rand() % 100;
        cout << "producer, 生产一个数据:" << data << endl;
        bqueue->Push(data);
        sleep(1);
    }

    return nullptr;
}

// 消费者线程：调用pop接口，取出数据
void *Consume(void *args)
{
    BlockQueue<int> *bqueue = (BlockQueue<int> *)args;

    // 消费数据：
    while (true)
    {
        int data;
        bqueue->Pop(&data);
        cout << "consumer, 消费一个数据: " << data << endl;
        sleep(1);
    }

    return nullptr;
}

int main()
{
    //用于充当数据资源
    srand((unsigned int)time(nullptr));

    //创建交易场所：阻塞队列
    BlockQueue<int>* bqueue = new BlockQueue<int>();

    //创建两类线程：生产者、消费者
    pthread_t ptor, cmer;
    pthread_create(&ptor, nullptr, Produce, (void*)bqueue);//arg参数：传入阻塞队列，让两个线程能够看到同一个交易场所
    pthread_create(&cmer, nullptr, Consume, (void*)bqueue);

    //线程终止
    pthread_join(ptor, nullptr);
    pthread_join(ptor, nullptr);

    delete bqueue;//注意释放空间

    return 0;
}